﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace GeradorVersao
{
    public partial class FrmPrincipal : Form
    {
        #region Variaveis e Constantes
        private const string Argumento = @"AABBPOA = 0 : JUVENILCS = 0 : SETESETEMBRO = 0 : AABBCS = 0 : AABBSM = 0 : ALIANCASC = 0 : AQUATICO = 0 : ARRANCA = 0 : AISM = 0 : ATC = 0 : BELAVISTA = 0 : CAMPESTREPF = 0 : COMERCIALSA = 0 : CTCLAJEADO = 0 : GAUCHO = 0 : GFRONTEIRA = 0 : JUVENILPF = 0 : LAJEADENSE = 0 : RECCRUZEIRO = 0 : RGYC = 0 : SENTINELA = 0 : SOCEPE = 0 : SRIJUI = 0 : RIOBRANCO = 0 : SOGI = 0 : SOVA = 0 : TERESOPOLIS = 0 : CRDORES = 0 : GNU = 0 : LINDOIA = 0 : SAMBORJENSE = 0 : CUC = 0 : CORINTIANS = 0 : COUNTRYPOA = 0 : COMERCIALPF = 0 : AABBFORTALEZA = 0 : FORZA = 0 : OSCARPITHAN = 0 : SOMBRIO = 0 : TIARAJU = 0";

        Clientes cli = new Clientes();
        #endregion

        #region Propriedades
        public string PathVB6 { get; set; }

        public string PathProj { get; set; }

        public string PathArq { get; set; }

        public string Argumentos { get; set; }

        #endregion


        public FrmPrincipal()
        {
            InitializeComponent();
        }

        #region Marcar
        private void BtnMarcar_Click(object sender, EventArgs e)
        {
            if (Convert.ToBoolean(BtnMarcar.Tag) == true)
            {
                for (int i = 0; i < ChkClientes.Items.Count; i++)
                {
                    ChkClientes.SetItemChecked(i, true);
                }
                LblMarcar.Text = "Desmarcar Todos";
                BtnMarcar.Tag = false;
            }
            else
            {
                for (int i = 0; i < ChkClientes.Items.Count; i++)
                {
                    ChkClientes.SetItemChecked(i, false);
                }
                LblMarcar.Text = "Marcar Todos";
                BtnMarcar.Tag = true;
            }
        }

        #endregion

        #region Gerar
        private void BtnGerar_Click(object sender, EventArgs e)
        {
            bool tudoOK = true;
            string FullPath = string.Empty;
            int count = 0;

            if (string.IsNullOrEmpty(TxtCaminhoVb6.Text))
            {
                MessageBox.Show("Favor, selecionar o caminho do compilador.");
                BtnBuscaVb6.Focus();
                tudoOK = false;
            }
            else if (string.IsNullOrEmpty(TxtCaminhoProj.Text))
            {
                MessageBox.Show("Favor, selecionar o caminho do projeto a ser compilado.");
                BtnBuscaProj.Focus();
                tudoOK = false;
            }
            else if (string.IsNullOrEmpty(TxtCaminhoArq.Text))
            {
                MessageBox.Show("Favor, selecione o caminho que será gerado os arquivos.");
                BtnBuscaArq.Focus();
                tudoOK = false;
            }
            else if (ChkClientes.SelectedItems.Count == 0)
            {
                MessageBox.Show("Favor, selecione algum cliente.");
                ChkClientes.Focus();
                tudoOK = false;
            }

            if (tudoOK)
            {
                BtnGerar.Enabled = false;
                BtnBuscaArq.Enabled = false;
                BtnBuscaProj.Enabled = false;
                BtnBuscaVb6.Enabled = false;
                pBar.Style = ProgressBarStyle.Marquee;
                pBar.MarqueeAnimationSpeed = 50;

                for (int i = 0; i < ChkClientes.Items.Count; i++)
                {
                    if (ChkClientes.GetItemChecked(i))
                    {
                        count++;
                        stlbCliente.Text = "Criando aplicação para " + ChkClientes.Items[i].ToString() + " " + count + " de " + ChkClientes.SelectedItems.Count;

                        FullPath = PathArq + Clientes.GetEnumDescription((Cliente)Enum.Parse(typeof(Cliente), ChkClientes.Items[i].ToString()));

                        if (!Directory.Exists(FullPath))
                        {
                            Directory.CreateDirectory(FullPath);
                        }
                        if (AjustaArgumentos(ChkClientes.Items[i].ToString()))
                        {
                            if (AjustaProjeto(FullPath))
                            {
                                if (Compilar())
                                {
                                    ChkClientes.SetItemChecked(i, false);

                                    Application.DoEvents();
                                }
                            }
                        }
                    }
                }

                MessageBox.Show("Geração efetuada com sucesso");
                BtnGerar.Enabled = true;
                BtnBuscaArq.Enabled = true;
                BtnBuscaProj.Enabled = true;
                BtnBuscaVb6.Enabled = true;
                pBar.Style = ProgressBarStyle.Continuous;
                pBar.MarqueeAnimationSpeed = 0;
            }
        }

        #endregion

        #region Busca Executavel VB6
        private void BtnBuscaVb6_Click(object sender, EventArgs e)
        {
            Ofd = new OpenFileDialog();
            Ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
            Ofd.Title = "Selecione o Compilador VB6";
            Ofd.Filter = "Visual Basic |*.EXE";

            if (Ofd.ShowDialog() == DialogResult.OK)
                PathVB6 = Ofd.FileName;
            //PathVB6 = @"C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE";
            TxtCaminhoVb6.Text = PathVB6;
        }
        #endregion

        #region Busca Projeto

        private void BtnBuscaProj_Click(object sender, EventArgs e)
        {
            int pos = 0;
            Ofd = new OpenFileDialog();
            Ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            Ofd.Title = "Selecione o Projeto a ser compilado";
            Ofd.Filter = "Visual Basic Project |*.vbp";

            if (Ofd.ShowDialog() == DialogResult.OK)
                PathProj = Ofd.FileName;

            // PathProj = @"D:\Users\Ivan\Desktop\SAC_VB6\SacForWin.vbp";

            if (!string.IsNullOrEmpty(PathProj))
            {
                TxtCaminhoProj.Text = PathProj;

                string texto = File.ReadAllText(PathProj, Encoding.UTF7);

                if (texto.Length > 0)
                {
                    pos = texto.IndexOf("MajorVer=");
                    NudVersao.Value = Convert.ToDecimal(texto.Substring(pos + 9, 2).Trim());
                    pos = texto.IndexOf("MinorVer=");
                    NudRevisao.Value = Convert.ToDecimal(texto.Substring(pos + 9, 2).Trim());
                    pos = texto.IndexOf("RevisionVer=");
                    NudAppMajor.Value = Convert.ToDecimal(texto.Substring(pos + 12, 2).Trim());
                }
            }
        }

        #endregion

        #region Busca Local dos Arquivos
        private void BtnBuscaArq_Click(object sender, EventArgs e)
        {
            Fbd = new FolderBrowserDialog();
            Fbd.RootFolder = Environment.SpecialFolder.MyComputer;
            Fbd.Description = "Selecione o local onde será salvo os arquivos";

            if (Fbd.ShowDialog() == DialogResult.OK)
                PathArq = Fbd.SelectedPath;

            TxtCaminhoArq.Text = PathArq;
        }

        #endregion

        #region Ajusta Argumentos
        private bool AjustaArgumentos(string clube)
        {
            bool retorno = false;
            try
            {
                if (clube.Equals("FORZA"))
                    Argumentos = Argumento;
                else
                    Argumentos = Argumento.Replace(clube + " = 0", clube + " = 1");
                retorno = true;
            }
            catch { }
            return retorno;
        }

        #endregion

        #region Ajusta Projeto

        private bool AjustaProjeto(string PathClube)
        {
            string texto = string.Empty;
            string search = string.Empty;
            int pos, pos2 = 0;
            bool retorno = false;

            try
            {
                texto = File.ReadAllText(PathProj);

                pos = texto.IndexOf("MajorVer=");
                pos2 = texto.IndexOf("AutoIncrementVer=");

                search = texto.Substring(pos, pos2 - pos);

                texto = texto.Replace(search, "MajorVer=" + NudVersao.Value + Environment.NewLine + "MinorVer=" + NudRevisao.Value + Environment.NewLine + "RevisionVer=" + NudAppMajor.Value + Environment.NewLine);

                pos = texto.IndexOf(@"Path32=""") + 8;
                pos2 = texto.IndexOf("Command32=") - 3;
                search = texto.Substring(pos, pos2 - pos);

                texto = texto.Replace(search, PathClube);

                pos = texto.IndexOf(@"CondComp=""") + 10;
                pos2 = texto.IndexOf("CompilationType=") - 3;

                search = texto.Substring(pos, pos2 - pos);

                texto = texto.Replace(search, Argumentos);

                File.WriteAllText(PathProj, texto);

                retorno = true;
            }
            catch
            { }

            return retorno;
        }

        #endregion

        #region Compilar
        private bool Compilar()
        {
            bool retorno = false;
            string comando = string.Empty;
            ProcessStartInfo pInfo = null;
            Process processo = null;

            try
            {
                comando = @"/C """ + PathVB6 + @""" " + PathProj + " /MAKE";

                pInfo = new ProcessStartInfo("Cmd.exe", comando);
                pInfo.CreateNoWindow = true;
                pInfo.UseShellExecute = false;
                processo = Process.Start(pInfo);

                do
                {
                    Thread.Sleep(500);
                    Application.DoEvents();

                } while (!processo.HasExited);

                retorno = true;
            }
            catch { }

            return retorno;
        }

        #endregion
    }
}
